package reflect;


import org.junit.Test;

import java.lang.reflect.Method;

/**
 * @description: 获取运行时类的方法结构
 * @author: apple
 * @date:  2021/12/28 11:21 下午
 * @version 1.0
 **/
public class MethodTest {

    @Test
    public void test1() {
        final Class<Person> personClass = Person.class;
        // 获取当前运行时类及其父类所有public修饰的方法
        final Method[] methods = personClass.getMethods();
        for (Method m : methods) {
            System.out.println(m);
        }

        System.out.println("------");
        // 获取当前运行时类定义的所有方法，包括private修饰的（不包含父类）
        final Method[] declaredMethods = personClass.getDeclaredMethods();
        for (Method m : declaredMethods) {
            System.out.println(m);
        }
        System.out.println("---");
        final Class<?>[] interfaces = personClass.getInterfaces();
        for (Class<?> inter : interfaces) {
            System.out.println(inter.getName());
        }

    }

    @Test
    public void test2() {
        /*
        @XXX
        访问修饰符 返回值类型 方法名(参数列表) throws XXX
         */
        final Class<Person> personClass = Person.class;


        final Method[] declaredMethods = personClass.getDeclaredMethods();
        for (Method m : declaredMethods) {
            // 获取方法声明的注解
//            final Annotation[] annotations = m.getAnnotations();
//            for (Annotation a : annotations) {
//                System.out.println(a);
//            }

            // 获取权限修饰符
//            final String s = Modifier.toString(m.getModifiers());
//            System.out.println(s + " " + m.getName());

            // 获取返回值类型
//            final Class<?> returnType = m.getReturnType();
//            System.out.println(returnType);

            // 获取方法名
//            System.out.println(m.getName());

            // 获取形成列表
//            final Class<?>[] parameterTypes = m.getParameterTypes();
//            System.out.println(m.getName() + " " + parameterTypes.length);

            // 获取抛出的异常
            final Class<?>[] exceptionTypes = m.getExceptionTypes();
            System.out.println(exceptionTypes.length);



        }
    }
}
